/* ***** BEGIN LICENSE BLOCK *****
 * Copyright (C) 2010-2011, The VNREAL Project Team.
 * 
 * This work has been funded by the European FP7
 * Network of Excellence "Euro-NF" (grant agreement no. 216366)
 * through the Specific Joint Developments and Experiments Project
 * "Virtual Network Resource Embedding Algorithms" (VNREAL). 
 *
 * The VNREAL Project Team consists of members from:
 * - University of Wuerzburg, Germany
 * - Universitat Politecnica de Catalunya, Spain
 * - University of Passau, Germany
 * See the file AUTHORS for details and contact information.
 * 
 * This file is part of ALEVIN (ALgorithms for Embedding VIrtual Networks).
 *
 * ALEVIN is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License Version 3 or later
 * (the "GPL"), or the GNU Lesser General Public License Version 3 or later
 * (the "LGPL") as published by the Free Software Foundation.
 *
 * ALEVIN is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * or the GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License and
 * GNU Lesser General Public License along with ALEVIN; see the file
 * COPYING. If not, see <http://www.gnu.org/licenses/>.
 *
 * ***** END LICENSE BLOCK ***** */
package vnreal.mapping;

import vnreal.demands.AbstractDemand;
import vnreal.resources.AbstractResource;

/**
 * <p>
 * Map a single pair of {@link AbstractDemand} and {@link AbstractResource}.
 * </p>
 * 
 * <p>
 * Uses the behavioral design pattern "mediator" to encapsulate the
 * communication of objects of classes {@link AbstractDemand} and
 * {@link AbstractResource} with a mediator object.
 * </p>
 * 
 * @see http://en.wikipedia.org/wiki/Mediator_pattern
 * @see http://sourcemaking.com/design_patterns/mediator
 * 
 * @author Michael Duelli
 * @author Vlad Singeorzan
 * @since 2010-08-20
 */
public final class Mapping {
	private final AbstractDemand demand;
	private final AbstractResource resource;

	public Mapping(AbstractDemand dem, AbstractResource res) {
		this.demand = dem;
		demand.register(this);

		this.resource = res;
		resource.register(this);
	}

	/**
	 * Unregister mapping from {@link #demand} and {@link #resource}.
	 * 
	 * @return true on success, false otherwise.
	 */
	public boolean unregister() {
		if (resource.unregister(this) && demand.unregister(this))
			return true;
		else
			throw new AssertionError("Could not properly unregister mapping");
	}

	public AbstractDemand getDemand() {
		return demand;
	}

	public AbstractResource getResource() {
		return resource;
	}
}
